package class07;

/**
 * 规定1对应A 2对应B 3对应C依此类推26对应Z
 * 那么一个数字字符串比如111就可以转化为AAA （11 1）KA Ak（1 11）
 * 给定一个只有数字字符组成的字符串str返回有多少种转化结果
 */
public class Code04_ConvertToLetterString {
    static int number(String str) {
        return process(str.toCharArray(), 0);
    }

    // str[i] 转化模型
    static int process(char[] str, int i) {
        if (i == str.length) {
            return 1;
        }
        //之前决策错误
        if (str[i] == '0') {
            return 0;
        }

        // str[i]！=0
        int way = process(str, i + 1);// i 位置单独转
        if (i + 1 < str.length && ((str[i] - '0') * 10 + (str[i + 1] - '0') * 10) < 27) {
            way += process(str, i + 2);
        }
        return way;


    }

    static int dp(String s) {
        char[] str = s.toCharArray();
        int n = s.length();
        int[] dp = new int[n + 1];

        dp[n] = 1;
        for (int i = n-1; i >=0; i--) {
            if (str[i] != '0') {
                int way = dp[i + 1];
                if (i + 1 < str.length && ((str[i] - '0') * 10 + (str[i + 1] - '0') * 10) < 27) {
                    way += dp[i + 2];
                }
                dp[i] = way;
            }
        }


        return dp[0];
    }

    public static void main(String[] args) {
        System.out.println(number("111"));
        System.out.println(dp("111"));

    }
}
